<?php
namespace Libaray\Util;

/**
 * 验证类
 * 如有添加新规则，直接声明常量即可，通过is[常量的驼峰]调用，如isPhone将验证POHNE的正则，isMyRule将验证MY_RULE正则
 */
class Validator
{
    /* 邮箱 */
    const EMAIL = '/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/';
    /* 手机 */
    const MOBILE = '/^1[34578]{1}\d{9}$/';
    /* 固话 */
    const TELPHONE = '/^([0-9]{3,4}-)?[0-9]{7,8}$/';

    

    public static function __callStatic(string $function_name, array $arguments)
    {
        $propName = self::toConstName($function_name);
        if (!is_null($propName)) {
            $regex = constant('self::' . $propName);
            return boolval(preg_match($regex, $arguments[0]));
        } else {
            echo 'no name';
        }

    }

    /**
     * 将isXXX格式的字符串转为常量
     *
     * @param string $str
     * @return string
     */
    private static function toConstName($str)
    {
        preg_match('/is([\w|\d]+)/', $str, $matches);
        if ($matches && $matches[1]) {
            $propName = strtoupper(self::humpToLine(lcfirst($matches[1])));
            
            return $propName;
        } else {
            return null;
        }

    }

    /**
     * 驼峰转下划线
     *
     * @param string $str
     * @return string
     */
    public static function humpToLine($str){
        $str = preg_replace_callback('/([A-Z]{1})/',function($matches){
            echo $matches[0];
            return '_' . strtolower($matches[0]);
        }, $str);
        return $str;
    }
}